from flask import Blueprint, jsonify, request, redirect
from application.models.users.user import *
from application.tools.myredis import r

course_blue = Blueprint("courseblue", __name__, url_prefix="/course")


@course_blue.route("/getDetail")
def getDetail():
    # 获取id
    id = request.args.get('id')
    userid = request.args.get('userid')
    # 查询课程信息
    course = Course.query.filter(Course.id == id).first()
    # 加载浏览记录，获取userid
    if userid:
        key = "collection" + str(userid) + 'pro' + str(id)
        r.hash_add(key, 'id', course.id)
        r.hash_add(key, 'name', course.name)
    # 返回课程信息
    dict = {}
    course = Course.query.filter(Course.id == id).first()
    dict['id'] = course.id
    dict['ctype'] = course.ctype
    dict['name'] = course.name
    # 获取课程下所有的章节
    jies = Jie.query.order_by(Jie.tcount.asc()).filter(Jie.courseid == id).all()
    list = []
    for i in jies:
        list.append({'id': i.id, 'name': i.name, 'url': i.url, 'tcount': i.tcount})
    dict['jies'] = list
    return jsonify({"code": 200, 'course': dict})


@course_blue.route("/getViews")
def getViews():
    userid = request.args.get('userid')
    findkey = "collecion" + str(userid) + "*"
    gidlist = r.getvalues(findkey)
    reslist = []
    for i in gidlist:
        goods = r.getall_hash(i)
        dict = {}
        for k, v in goods.items():
            kk = k.decode()
            vv = v.decode()
            dict[kk] = vv
        reslist.append(dict)
    return jsonify({"code": 200, 'lisyt': reslist})


# 加入购物车
@course_blue.route("/buy", methods=['POST'])
def buy():
    # 获取参数 userid courseid
    userid = request.args.get('userid')
    tcourseid = request.args.get('tcourseid')
    # 从hash中获取数据，如果存在数量+1 buy1course2
    type = 1
    try:
        type = request.args.get('type')
    except:
        pass
    key = "buy" + str(userid) + 'course' + str(tcourseid)
    # 如果不存在存入redis hash
    flag = r.findkey_hash(key)
    # 存在
    if flag:
        #     数量+1
        ff = r.jiajian_hash(key, 'number', 1, type)
        if ff == False:
            return jsonify({"code": 10010, "mes": "不能再减了"})
    else:
        r.hash_add(key, 'id', tcourseid)
        r.hash_add(key, 'number', 1)
        # 选中
        r.hash_add(key, 'flag', True)
    # 返回结果
    return jsonify({"code": 200, "userid": userid, "tcourseid": tcourseid})


@course_blue.route("/mycart")
def mycart():
    # 获取参数userid
    userid = request.args.get("userid")
    # 从hash中获取商品id和数量
    key = "buy" + str(userid) + "*"
    goods = r.getvalues(key)
    glist = []
    tmoney = 0
    tcount = 0

    if goods:
        for i in goods:
            # 获取每一条商品的具体信息
            good = r.getall_hash(i)

            rescourse = {}
            for k, v in good.items():
                params = k.decode()
                value = v.decode()
                if params == "id":
                    # 获取到的商品信息
                    tcourse = Tcourse.query.filter(Tcourse.id == value).first()
                    rescourse['id'] = tcourse.id
                    rescourse['name'] = tcourse.title
                    rescourse['url'] = tcourse.url
                    rescourse['price'] = float(tcourse.price)
                if params == 'number':
                    # 获取购买的数量
                    rescourse['number'] = value
                if params == 'flag':
                    if value == 'True':
                        rescourse['flag'] = True
                    else:
                        rescourse['flag'] = False
            # 小计
            rescourse["total"] = float(rescourse['price']) * float(rescourse['number'])
            # 总价
            tmoney = float(tmoney) + float(rescourse['total'])
            # 总数
            tcount = int(tcount) + int(rescourse['number'])
            glist.append(rescourse)
    # 价格、图片、名字...从mysql中获取，从redis商品缓存中读取
    return jsonify({"code": 200, "glist": glist, "tmoney": tmoney, "tcount": tcount})


# 获取训练营课程
@course_blue.route("/getBootcamp")
def getBootcamp():
    # 查询训练营课程
    bootcamp = Tcourse.query.all()
    bootlist = [{
        "id": i.id,
        "title": i.title,
        "url": i.url,
        "price": i.price,
        "intro": i.intro
    } for i in bootcamp]
    # 返回数据
    return jsonify({"code": 200, "bootlist": bootlist})


@course_blue.route("/modifyStatus")
def modifyStatus():
    # 如果true改为false，如果false改为true
    # 获取参数 userid goodsid
    userid = request.args.get('userid')
    cid = request.args.get('cid')
    # 获取原来的状态判断
    key = "buy" + str(userid) + 'course' + str(cid)
    flag = r.getone_hash(key, 'flag')
    # 设置默认为选中
    cflag = 'True'
    if flag:
        flag = flag.decode()
        # 根据返回结果选择相反的值
        if flag == 'True':
            cflag = 'false'

    r.hash_add(key, 'flag', cflag)
    return jsonify({"code": 200})


# 修改全选的选中状态
@course_blue.route('/modifyAllStatus')
def modifyAllStatus():
    # 获取参数 userid  goodsid
    userid = request.args.get('userid')
    status = request.args.get('status')
    flag = 'false'
    if status == 'true':
        flag = True
    # 把当前用户购物车全部改为选中状态
    keys = r.getvalues("buy" + str(userid) + "*")
    for i in keys:
        r.hash_add(i, 'flag', flag)
    return jsonify({'code': 200})


import json, time, random


# 生成订单
@course_blue.route("/create_orders", methods=['POST'])
def create_orders():
    # 接收参数userid
    data = json.loads(request.data)
    userid = int(data['userid'])
    # 接口幂等性操作，验证
    order_token = data['order_token']
    print("**************", order_token)
    value = r.str_get(order_token)
    print("==============", value)
    if not value:
        return jsonify({"code": 10020, 'mes': '已经生成不能重复操作'})
    # 删除
    r.del_str(order_token)
    # 根据userid查询购物车
    key = "buy" + str(data['userid']) + "*"
    glist = r.getvalues(key)
    # 生成订单号
    order_no = str(random.randint(100, 999)) + str(data['userid'])
    totalmoney = 0
    try:
        if glist:
            orders = Orders(order_no=order_no, userid=userid)
            db.session.add(orders)
            # 写入订单详情表
            for i in glist:
                flag = r.getone_hash(i, "flag")
                if flag:
                    flag = flag.decode()
                    if flag == 'True':
                        id = r.getone_hash(i, "id")
                        id = id.decode()
                        number = r.getone_hash(i, "number")
                        number = number.decode()
                        # 判断购物车中已选中的记录
                        tcourse = Tcourse.query.filter(Tcourse.id == id).first()
                        # 查询训练营课程表，判断库存
                        if int(tcourse.store) < int(number):
                            return jsonify({"code": 200, 'mes': "库存不够"})
                        # 写入订单详情表
                        tmoney = float(tcourse.price) + float(number)
                        detail = OrdersDetail(order_no=order_no, courseid=id, number=number, price=tcourse.price,
                                              tmoney=tmoney)
                        db.session.add(detail)
                        # 总价
                        totalmoney = totalmoney + tmoney
                        # 删除购物车已经选中的记录
                        # r.del_hash(i)
                # 写入订单表
            orders.tmoney = totalmoney
            db.session.add(orders)
            db.session.commit()
            return jsonify({"code": 200, 'mes': "购买成功", 'orderno': order_no})
    except:
        return jsonify({"code": 10010, "mes": '购买失败'})


import uuid


@course_blue.route("/get_order_token")
def get_order_token():
    # 生成token
    token = uuid.uuid1().hex
    print(token)
    # 将token存入redis
    r.str_add(token, '1')
    # 返回结果
    return jsonify({"code": 200, 'token': token})


@course_blue.route("/orders")
def orders():
    # order_no
    order_no = request.args.get('order_no')
    # sql = "select orders.order_no,orders.tmoney,od.* from orders inner join orders_detail as od on orders.order_no=od.order_no where od.order_no=%d"%(int(order_no))
    # res = db.session.execute(sql)
    # list = res.fetchall()
    # print(list)
    # return 'ok'
    orderdict = {}
    orders = Orders.query.filter(Orders.order_no == order_no).first()
    if orders:
        orderdict['order_no'] = orders.order_no
        orderdict['tmoney'] = orders.tmoney
        list = []
        for i in orders.details:
            list.append(
                {"courseid": i.courseid, 'cname': i.cname, 'price': i.price, 'number': i.number, 'tmoney': i.tmoney})
        orderdict['details'] = list
    return jsonify({"code": 200, 'orders': orderdict})


from application.tools.comm import get_ali_object


# 支付宝支付
@course_blue.route("/buytcourse", methods=['POST'])
def buytcourse():
    # 订单号
    order_no = request.args.get('order_no')
    print("****************", order_no)
    orders = Orders.query.filter(Orders.order_no == order_no).first()
    print("****************", orders.tmoney)
    # 支付，返回支付url
    pay = get_ali_object()
    # 生成支付的url
    # 订单号重构充值1 支付订单2
    order_no = str(order_no) + ":" + str(2)
    query_params = pay.direct_pay(
        subject="test",  # 商品简单描述
        out_trade_no=str(order_no),  # 用户购买的商品订单号（每次不一样） 20180301073422891
        total_amount=float(orders.tmoney),  # 交易金额(单位: 元 保留俩位小数)
    )
    pay_url = "https://openapi.alipaydev.com/gateway.do?{0}".format(query_params)  # 支付宝网关地址（沙箱应用）
    return jsonify({'code': 200, 'url': pay_url})


import os


@course_blue.route("/upload", methods=['POST'])
def upload():
    # 获取文件
    file = request.files.get('file')
    path = os.path.join("upload/media/" + file.filename)
    # 保存文件
    file.save(path)
    # 删除
    # 通过id获取到数据，url
    # 删除数据库
    # url = "upload/100.jpg"
    # os.remove(url)
    return jsonify({"code": 200, 'url': path})


@course_blue.route("/addjie", methods=['POST', 'GET'])
def addjie():
    if request.method == "GET":
        cid = request.args.get("cid")
        dict = {}
        course = Course.query.filter(Course.id == cid).first()
        dict['id'] = course.id
        dict['name'] = course.name
        jies = Jie.query.order_by(Jie.tcount.asc()).filter(Jie.courseid == cid).all()
        list = []
        for i in jies:
            list.append({'id': i.id, 'name': i.name, 'url': i.url})
        dict['jies'] = list
        return jsonify({"code": 200, 'course': dict})
    else:
        pass


# 获取评价信息
@course_blue.route("/comments", methods=['POST', 'GET'])
def comments():
    if request.method == "GET":
        # 获取分类
        types = CommentType.query.all()
        tlist = [{
            "id": i.id,
            "name": i.name
        } for i in types]
        # 获取默认分类吓得评论
        # 查询此分类下面的评论及回复
        sql = "select u.url,u.nikename,u.level,c.title,c.tcount,c.tviews from comment as c inner join user as u on c.userid=u.id where c.pid=0"
        res = db.session.execute(sql)
        comments = res.fetchall()
        commentslist = []
        for i in comments:
            commentslist.append(
                {'url': i[0], 'nikename': i[1], 'level': i[2], 'title': i[3], 'tcount': i[4], 'tviews': i[5]})
        qqq = "select u.nikename,u.level,c.create_time from user as u inner join comment as c on u.id = c.userid where c.is_last=1"
        www = db.session.execute(qqq)
        ucomment = www.fetchall()
        ucommentslist = []
        for i in ucomment:
            ctime = i['create_time']
            hour = int((int(time.time()) - int(time.mktime(ctime.timetuple()))) / 3600)
            ucommentslist.append({'nikename': i[0], 'level': i[1], 'times': hour})
        return jsonify({'code': 200, "tlist": tlist, "commentslist": commentslist, "ucommentslist": ucommentslist})
    else:
        # 获取参数 userid comment 评价id
        userid = 5
        comment = "2342342342342"
        # 被评价的id
        cid = 1
        # 分类id
        typepid = 1
        comment = Comment(title=comment, is_last=1, userid=userid, typepid=typepid, pid=cid, send_id=cid)
        db.session.add(comment)
        db.session.commit()
        return jsonify({"code": 200})


@course_blue.route("/user_collect", methods=['POST', 'GET'])
def user_collect():
    if request.method == "POST":
        # 获取参数
        data = json.loads(request.data)
        userid = int(data['userid'])
        cid = int(data['cid'])
        flag = data['flag']
        # 向收藏表添加数据
        # sql = "insert into user_collect_course values(%d,%d)"%(int(cid),int(userid))
        # db.session.execute(sql)
        #
        # sql = "select c.* from course as c inner join user_collect_course as uc on uc.courseid=course.c.id where uc.userid=1"

        user = User.query.filter(User.id == userid).first()
        course = Course.query.filter(Course.id == cid).first()
        if flag == 'true':
            user.courses.append(course)
        else:
            user.courses.remove(course)
        db.session.commit()

        return jsonify({"code": 200})
